package ru.omsu.diveintoandroid.funnycats.engine;

import static java.lang.Math.abs;

import org.cocos2d.nodes.CCSprite;
import org.cocos2d.types.CGPoint;
import org.cocos2d.types.CGSize;

import android.util.Log;

//XXX:ключевой класс движка, представляет собой объект мира,
//в нашей реализации объект несет в себе логику по перемещению
//это не хорошо, GameObject должен представлять собой набор свойств 
//и не содержать логики по перемещению, за это должен отвечать GameWorld
//в нашем случае логика по перемещению разделена между GameObject и GameWorld
//отсюда методы типа simulateMove
public class GameObject extends PrototypeObject{
	
	public GameObject(CCSprite sprite, CGSize size, CGPoint position) {
		super(sprite,size,position);
	}

	public CGPoint getSpeed() {
		return speed;
	}

	public void setSpeed(CGPoint speed) {
		this.speed = CGPoint.ccp(speed.x / 1000, speed.y / 1000);
	}
	
	public void increaseSpeed(){
		speed.x *= 1.25;
		speed.y *= 1.25;
	}
	
	public CGPoint getAcceleration() {
		return acceleration;
	}
	
	public void setAcceleration(CGPoint acceleration) {
		this.acceleration = acceleration;
	}
	
	public CGPoint simulateMove(long dt){
		return CGPoint.ccp(position.x + speed.x * dt, position.y + speed.y * dt);
	}
	
	public void move(long dt){
		Log.d("PilotTest", "move");
		position.x += speed.x * dt;
		position.y += speed.y * dt;
		speed.x += acceleration.x * dt;
		speed.y += acceleration.y * dt;
	}
	
	public void reverseX(){
		speed.x *= -1;
	}
	
	public void reverseY(){
		speed.y *= -1;
	}
		
	public boolean isContactWithOther(PrototypeObject other){
		boolean contactX = abs(position.x - other.position.x) < (size.width + other.size.width) / 2;
		boolean contactY = abs(position.y - other.position.y) < (size.height + other.size.height) / 2;

		return contactX && contactY;
	}
	
	public void setEffect(Effect E){
		effect = E;
	}
	
	public Effect getEffect(){
		return effect;
	}
	
	public void removeEffect(){
		if(!effect.isActive()){
			speed.x /= effect.getSpeedFactor();
			speed.y /= effect.getSpeedFactor();
			isEffectActive = false;
		}
	}
	
	public void activateEffect(){
		speed.x *= effect.getSpeedFactor();
		speed.y *= effect.getSpeedFactor();
		isEffectActive = true;
	}
	
	public boolean isEffectActive(){
		return isEffectActive;
	}
	
	public Boolean isUnderEffect;
	private CGPoint speed = CGPoint.ccp(0.0f, 0.0f);
	private CGPoint acceleration = CGPoint.ccp(0.0f, 0.0f);
	
	private Effect effect = new Effect();
	private boolean isEffectActive = false;
}
